﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.ActiveRecord;
using Castle.Components.Validator;


namespace Matriculex.Dominio
{
    [ActiveRecord("aluno"), JoinedBase, Serializable]
    public abstract class Aluno : Usuario
    {
        // construtor vazio necessário para o ActiveRecord
        protected Aluno() { }

        public Aluno(string numeroPECE, string nome, string email)
            :base(nome, email)
        {
            this.NumeroPECE = numeroPECE;
        }

        [JoinedKey]
        public override int Id { get { return base.Id; } }
        
        [Property]
        [ValidateNonEmpty("Número PECE não pode ser vazio.")]
        public string NumeroPECE { get; set; }
        [Property]
        public string Endereço { get; set; }
        [Property]
        public bool Bolsista { get; set; }
        [Property]
        public bool Inadimplente { get; set; }

        public abstract Curso GetCurso();



        public override void Save()
        {
            Aluno[] alunos = FindAllByProperty("NumeroPECE", this.NumeroPECE);
            // se é um novo curso
            if (this.IsTransient())
            {
                if (alunos != null && alunos.Length > 0)
                    throw new DominioException("Já existe um aluno com este Número PECE");
            }
            else
            {
                // se vamos salvar
                if (alunos != null && alunos.Length > 0)
                {
                    // se há mais de 1 curso com este código (inconsistencia)
                    // ou o Id do curso de código existen não é este
                    if (alunos.Length > 1 || alunos[0].Id != this.Id)
                        throw new DominioException("Já existe um aluno com este Número PECE");
                }
            }

            base.Save();
        }


        # region Métodos estáticos do ActiveRecord
        public static new void DeleteAll()
        {
            DeleteAll(typeof(Aluno));
        }

        public static new Aluno[] FindAll()
        {
            return (Aluno[])FindAllByProperty(typeof(Aluno), "Ativado", true);
        }

        public static Aluno Find(int id)
        {
            return (Aluno)FindByPrimaryKey(typeof(Aluno), id);
        }

        public static new Aluno[] FindAllByProperty(string property, object value)
        {
            return ActiveRecordBase<Aluno>.FindAllByProperty(property, value).Where(o => o.Ativado == true).ToArray();
        }

        #endregion
    }
}
